前言
前段时间我在专栏里详细分析了目标检测中的特征冲突与不对齐问题,今天无意间又看到了商汤在CVPR2020的一篇相关论文,分析角度跟我之前所说的类似,但是解决方案增加了一些技巧,论文中提到其对于各类backbone都有~3%mAP的提升,该算法也用到了OpenImage比赛中,是对Decoupling Head框架的详细分析。这里我们一起来分析下论文内容。
一、背景介绍
前段时间我写了两篇相关的博客《谈谈CNN中的位置和尺度问题》[2]和《目标检测中的特征冲突与不对齐问题》[3]。其中其第一篇里面我详细分析了CNN中平移和尺度不变性和相等性问题,并介绍了padding对于位置估计的影响。在第二篇中我们从回归和分类任务对于平移/尺度不变性和相等性要求的冲突展开了一系列讨论,并结合anchor和特征的不对齐介绍了two-stage和one-stage检测算法的相关解决方案。因此强烈建议在阅读本篇内容之前先看看上两篇。
论文一开始就给出了一副直观的示意图,图中展示的是分类和定位任务对于特征空间的敏感性对比,其中分类任务只对特定区域敏感,而定位任务对于目标整体,也可以说是目标边界都很敏感,这一点就衬托出二者对于特征的要求不同。之前的博客里我们所介绍的解决方案是尽可能减少定位和分类分支的特征共享部分。比如原始的Double Head的处理方式是在ROI Pooling之后进行解耦:
而商汤之前《1st Place Solutions for OpenImage2019 - Object Detection and Instance Segmentation》一文中所提出的Decoupling Head算法则是更为复杂的方式,我之前的博客中好像说漏了一部分,而关于这一点的详细介绍可以在这篇文章中得到解答。
二、 Task-aware spatial disentanglement learning
论文所提出的算法名为TSD,我们重点要关注的是图中的三个部分,我们先看Spatial disentanglement和TSD部分:
首先作者定义了新的损失函数形式:
$$ \begin{array}{l} L = L_{cls}^D\left( {H_1^D\left( {{F_l},{{\hat P}_c}} \right),y} \right) + L_{loc}^D\left( {H_2^D\left( {{F_l},{{\hat P}_r}} \right),B} \right)\\ \left\{ \begin{array}{l} H_1^D\left( \cdot \right) = \left\{ {{f_c}\left( \cdot \right),C\left( \cdot \right)} \right\}\\ H_2^D\left( \cdot \right) = \left\{ {{f_r}\left( \cdot \right),R\left( \cdot \right)} \right\} \end{array} \right. \end{array} $$
跟传统的方式不同,作者想通过特征变换的方式让两个任务执行得更好,关于这一点可以在[3]中的Guided Anchoring和AlignDet等算法中看到类似的思路,即基于预测的anchor框offset,通过deform conv的方式重新提取特征进行分类。这里作者令分类任务的特征变换形式为point-wise,令回归任务特征变换的形式为proposal-wise,也就是说作者让网络特征通过两种变换形式变成了任务驱动型的特征输入。
下面我们来看看两种变换具体是怎么执行的。
$$ \left\{ \begin{array}{l} {{\hat P}_c} = {\tau _c}\left( {P,\Delta C} \right),\Delta C = \gamma {F_c}\left( {F;{\theta _c}} \right) \cdot \left( {w,h} \right)\\ {{\hat P}_r} = {\tau _r}\left( {P,\Delta R} \right),\Delta R = \gamma {F_r}\left( {F;{\theta _r}} \right) \cdot \left( {w,h} \right) \end{array} \right. $$
对于分类部分,这一部分我们比较熟悉,作者通过第一阶段的回归结果,预测了256x256x(kxkx2)大小的偏移量,其中kxk指的是ROI Pooling之后的特征图大小。通过这个offset,基于deformable conv的方式对特征重采样,重采样的特征用于分类,之前已经讨论过了。
我们再看回归部分,作者通过第一阶段的回归结果,在此基础上预测了框特征的偏移量,即256x256x2,不同的是,这个偏移量是proposal-wise的,也就是说框的整体平移,通过平移进行特征采样。
综上,TSD部分的创新在于对回归和分类都进行了特征变换,不同的是回归采用特征平移,而分类则采用我们熟悉的模式。
三、 Progressive constraint
如果我们观察了Decoupling Head框架,会发现除了回归和分类两个分支,作者还保留了原有的ROI-Pooling主干。关于这一点,作者在这篇文章也解释了,就是上文中的Sibling head+PC部分。这一部分呢主要还是为了提升TSD性能而提出来的,我们可以总结为一致性约束,即令TSD和传统ROI Pooling主干结果保持一致。
四 、实验结果
这里我简单罗列部分实验结果:
这里作者主要想表明TSD+PC的策略对于不同的backbone都有提升,这里我再给出COCO的结果:
可见本文的效果的确不错。
五、总结
综上呢,其实我们可以看到,绝大多数的内容都在之前的博客中讲到了,不同的地方只有回归部分特征的平移策略,以及模型的ensemble策略。这篇博客的主要目的是对之前内容的一点补充,以上这些主要讲的还是特征层面的应对策略,对于我们之前所提及的关于NMS过程中分类置信度的“不可信”问题并没有进行说明。
而之前有知友在评论里面提到了ICCV2019的Guassian YOLOv3,其代码链接为:https://github.com/jwchoi384/Gaussian_YOLOv3
这个算法通过将回归任务改进为高斯分布参数的预测,从侧面预测了回归框的可靠性,进而利用这部分参数修正回归框和分类置信度,不失为一种改进策略:
$$ prob = {P_{object}} \times {P_{clas{s_i}}} \times \left( {1 - \frac{{{\delta _x} + {\delta _y} + {\delta _w}{\rm{ + }}{\delta _h}}}{4}} \right) $$
不过这方面的研究还没结束,期待以后有更简洁的特征层面的解决策略~
参考资源
[1] Revisiting the Sibling Head in Object Detector
[2] https://zhuanlan.zhihu.com/p/113443895
[3] https://zhuanlan.zhihu.com/p/114700229
[4]1st Place Solutions for OpenImage2019 - Object Detection and Instance Segmentation.
[5]Gaussian YOLOv3: An Accurate and Fast Object Detector Using Localization Uncertainty for Autonomo